#pragma once
// Object.h
// 作者：MetaQuotes Ltd.（整理）
// 说明：CObject 基类接口声明，带中文注释

#include "StdLibErr.h"

/**
 * @brief 元素存储基类
 * 
 * 功能：
 *  - 提供链表节点指针管理（前驱和后继）
 *  - 提供文件操作接口（可被派生类重载）
 *  - 提供类型识别和比较接口（可被派生类重载）
 */
class CObject
{
private:
    CObject *m_prev;  ///< 前一个节点
    CObject *m_next;  ///< 后一个节点

public:
    /**
     * @brief 构造函数，初始化前驱和后继为 NULL
     */
    CObject(void) : m_prev(NULL), m_next(NULL) {}

    /**
     * @brief 析构函数
     */
    ~CObject(void) {}

    //--- 链表节点访问方法
    /**
     * @brief 获取前一个节点
     * @return 前驱节点指针
     */
    CObject *Prev(void) const { return m_prev; }

    /**
     * @brief 设置前一个节点
     * @param node 前驱节点指针
     */
    void Prev(CObject *node) { m_prev = node; }

    /**
     * @brief 获取后一个节点
     * @return 后继节点指针
     */
    CObject *Next(void) const { return m_next; }

    /**
     * @brief 设置后一个节点
     * @param node 后继节点指针
     */
    void Next(CObject *node) { m_next = node; }

    //--- 文件操作方法（可被派生类重载）
    /**
     * @brief 保存对象到文件
     * @param file_handle 文件句柄
     * @return 默认返回 true，可被重载实现实际保存
     */
    virtual bool Save(const int file_handle) { return true; }

    /**
     * @brief 从文件加载对象
     * @param file_handle 文件句柄
     * @return 默认返回 true，可被重载实现实际加载
     */
    virtual bool Load(const int file_handle) { return true; }

    //--- 对象类型识别方法（可被派生类重载）
    /**
     * @brief 获取对象类型
     * @return 默认返回 0，可被重载返回实际类型
     */
    virtual int Type(void) const { return 0; }

    //--- 对象比较方法（可被派生类重载）
    /**
     * @brief 比较当前对象与另一个对象
     * @param node 另一个对象指针
     * @param mode 比较模式，默认为 0
     * @return 默认返回 0，可被重载实现实际比较
     */
    virtual int Compare(const CObject *node, const int mode = 0) const { return 0; }
};
